package template2

import (
	"errors"
	"fmt"
	"gitee.com/chejiangyi/bsfgo/core/utils"
	"html/template"
	"reflect"
	"strings"
	"time"
)

type BaseTemplateTool struct {
}

// Substring3 截取字符串
func (BaseTemplateTool) Substring3(str string, maxLen int) string {
	if utils.StringUtil.IsEmpty(str) {
		return str
	}
	if len(str) <= maxLen {
		return str
	}
	return str[:maxLen] + "..."
}

func (BaseTemplateTool) Concat(str1 string, str2 string) string {
	return str1 + str2
}

// TotalPageNum 计算总页数
func (BaseTemplateTool) TotalPageNum(totalRecord, pageSize int) int {
	return (totalRecord + pageSize - 1) / pageSize
}

// Help 生成帮助图标HTML
func (BaseTemplateTool) Help(str string) template.HTML {
	return template.HTML(fmt.Sprintf("<img class='texthelp' width=\"20\" height=\"20\" title=\"%s\" style=\"\" src=\"/images/help.png\">", str))
}

// IsNull 检查对象是否为nil
func (BaseTemplateTool) IsNull(o interface{}) bool {
	return o == nil
}

// Empty 将nil或"null"转换为空字符串
func (BaseTemplateTool) E(o interface{}) interface{} {
	if o == nil || fmt.Sprint(o) == "null" {
		return ""
	}
	return o
}

// Default 返回默认值
func (BaseTemplateTool) D(o, defaultValue interface{}) interface{} {
	if o == nil {
		return defaultValue
	}
	return o
}

// W1 条件判断
func (BaseTemplateTool) W1(condition bool, trueVal, falseVal interface{}) interface{} {
	if condition {
		return trueVal
	}
	return falseVal
}

// W2 条件判断
func (BaseTemplateTool) W2(condition string, data1, data2, trueObj, falseObj interface{}) interface{} {
	switch condition {
	case "==":
		if data1 == data2 {
			return trueObj
		}
		if data1 != nil && reflect.DeepEqual(data1, data2) {
			return trueObj
		}
		return falseObj
	case ">":
		num1, num2 := data1.(float64), data2.(float64)
		if num1 > num2 {
			return trueObj
		}
		return falseObj
	case "<":
		num1, num2 := data1.(float64), data2.(float64)
		if num1 < num2 {
			return trueObj
		}
		return falseObj
	default:
		panic(errors.New("条件不符合规范"))
		return nil
	}
}

//// EnumDesc 获取枚举描述
//func EnumDesc(enumClass string, value interface{}) string {
//	// Go中没有直接的枚举反射机制，需要根据具体实现调整
//	// 这里只是一个示例框架
//	return ""
//}

//// Enums 获取枚举列表
//func Enums(enumClass string) []interface{} {
//	// Go中没有直接的枚举反射机制，需要根据具体实现调整
//	// 这里只是一个示例框架
//	return []interface{}{}
//}

// Field 获取对象字段值
func (BaseTemplateTool) F(o interface{}, fieldName string) interface{} {
	if o == nil {
		return ""
	}
	val := reflect.ValueOf(o)
	if val.Kind() == reflect.Ptr {
		val = val.Elem()
	}
	if val.Kind() != reflect.Struct {
		return ""
	}
	field := val.FieldByName(fieldName)
	if !field.IsValid() {
		return ""
	}
	return field.Interface()
}

// Field2 获取嵌套字段值
func (BaseTemplateTool) F2(o interface{}, fieldName string) interface{} {
	if o == nil {
		return ""
	}
	fields := strings.Split(fieldName, ".")
	val := reflect.ValueOf(o)
	for _, f := range fields {
		if val.Kind() == reflect.Ptr {
			val = val.Elem()
		}
		if val.Kind() != reflect.Struct {
			return ""
		}
		val = val.FieldByName(f)
		if !val.IsValid() {
			return ""
		}
	}
	return val.Interface()
}

func (BaseTemplateTool) ToJSON(o interface{}) string {
	data := utils.JsonUtil.ToJson(o)
	return string(data)
}

// 支持yyyy-MM-dd HH:mm:SSS 格式
func (BaseTemplateTool) PrintTime(t time.Time, format string) string {
	return utils.TimeFormatString(t, format)
}

func (BaseTemplateTool) PrintTime2(t time.Time) string {
	return utils.TimeFormatString2(t)
}

// 打印
func (m BaseTemplateTool) P(o interface{}) string {
	if o == nil {
		return ""
	}
	// 使用反射判断类型
	switch v := o.(type) {
	case float64:
		return fmt.Sprintf("%.2f", v)
	case time.Time:
		return m.PrintTime2(v)
	default:
		return fmt.Sprintf("%v", o)
	}
}

func (BaseTemplateTool) Html(html string) template.HTML {
	return template.HTML(html)
}

func (BaseTemplateTool) ToolTest() string {
	return "工具测试"
}
